#!/bin/bash

:<<eof
1. 介绍
awk 文本处理工具，通常用于处理数据并生成结果报告

2. 基本形式
awk 'BEGIN{}pattern{commands}END{}' file
stdout | awk 'BEGIN{}pattern{commands}END{}' file


BEGIN{} 在处理数据之前会做的预执行的动作
pattern 匹配模式
{commands}  处理命令，可能多行
END{} 在处理所有匹配数据之后会做的预执行的动作

3. 内置变量(引用的时候不需要加上$)

$0      整行内容
$1-$n   当前行的第1-n个字段

NF      当前行的字段个数，也就是列数(number field)

NR      当前行的行号，从1开始(number row)
FNR     多文件处理时候，每个文件行号单独计数，都是从0开始(file number row)

FS      输入字段分隔符。不指定默认以空格或tab键分割(field separator)
OFS     输出字段分隔符。默认空格(output field separator)

RS      输入行分隔符。默认回车换行(row separator)[当前行中指定字符为换行] 
ORS     输出行分隔符，默认回车换行


FILENAME    当前输入的文件名字
ARGC    命令行参数个数
ARGV    命令行参数数组


4. pattern

- 正则表达式

awk 'BEGIN{}/pattern/{commands}END{}' file
- 逻辑关系
awk 'BEGIN{}$3>90{commands}END{}' file


awk "BEGIN{printf "%-8s%-8s%-8s%-8s%-8s","Name","Chinese","Math","English","Average"}{total=$2+$3+$4；AVG=total/4;printf "%-8s%-8d%-8d%-8d%-8.2f",$1,$2,$3,$4,AVG}" student.txt

>
<
>=
<=
==
!=
~   匹配正则表达式      $n~/pattern/
!~  不匹配正则表达式    $n!~/pattern/    
||  逻辑或  condition1 || condition2
&&  逻辑与  condition1 && condition2
!   逻辑非  !condition1 

5. commands - if-for

awk '{if(){}eles if(){}else{}}'
awk '{do{}while()}'
awk '{while(){}}'
awk '{for(;;){}}'

6. 字符串函数

length(str)         返回字符串长度                                         整数长度值
index(str1,str2)    在str1查找str2的位置                                   返回值为位置索引，从1计数
tolower(str)        转为小写        
toupper(str)        转为大写
substr(str,m,n)     从str的m个字符开始，截取n位，n若不指定，则默认为长度      截取后的子串   
sub(RE,RepStr,str)  替换查找到的第一个子串
gsub(RE,RepStr,str) 替换查找到的所有子串                
split(str,arr,fs)   按fs切割字符串，结果保存arr                             切割后的子串的个数
match(str,RE)       在str中按照RE查找，返回位置                             返回索引位置



7. 参数

-v 参数传递
-V 查看awk的版本号
-f 指定脚本文件
-F 指定分隔符

-f test.awk

awk -v 
awk -f test.awk file


test.awk

BEGIN{

}
{

}
END{

}


8. shell中数组用法

array=('a','b','c','d','d')

打印元素        echo ${array[2]}
打印元素个数    echo ${#array[@]}
打印元素长度    echo ${#array[1]}
元素赋值        array[2]='zz'
删除元素        unset array;unset array[2]
分片访问        echo ${array[@]:1:3}
元素内容替换    ${array[@]//1/3}
数组遍历

for item in array
do
    echo $item
done


eof



 


 



set +x

awk 'BEGIN{FS=":";OFS="|"}{print $1,$3}' passwd